#include "dem_reader.h"
#include <iostream>
#include <string>
#include <limits>

int main() {
    std::cout << "=== DEM高程计算器 ===" << std::endl;
    
    // 创建DEM读取器实例
    DemReader demReader;
    
    // DEM数据文件路径
    std::string demFilePath = "/Users/ajun/projects/github/geo-elevation-calc/bin_map/data/dem001.txt";
    
    // 提示用户大文件可能需要较多内存
    std::cout << "注意: DEM数据文件较大，加载过程可能需要较多内存和时间，请稍候..." << std::endl;
    
    // 加载DEM数据
    std::cout << "正在加载DEM数据文件: " << demFilePath << std::endl;
    if (!demReader.loadDemData(demFilePath)) {
        std::cerr << "错误: 无法加载DEM数据，程序将退出" << std::endl;
        return 1;
    }
    
    // 显示数据信息
    int ncols, nrows;
    double xllcorner, yllcorner, cellsize;
    demReader.getDataInfo(ncols, nrows, xllcorner, yllcorner, cellsize);
    
    std::cout << "\n数据范围信息:" << std::endl;
    std::cout << "- 左上角坐标: (" << xllcorner << ", " << (yllcorner + nrows * cellsize) << ")" << std::endl;
    std::cout << "- 右下角坐标: (" << (xllcorner + ncols * cellsize) << ", " << yllcorner << ")" << std::endl;
    
    // 预设测试点（来自用户之前提供的示例）
    // 选择这两个城市作为测试点是因为它们位于DEM数据覆盖范围内，且具有不同的地形特征
    // 成都位于四川盆地，西安位于关中平原，这样可以测试程序在不同地形下的计算准确性
    std::vector<std::pair<std::pair<double, double>, std::string> > testPoints;
    testPoints.push_back(std::make_pair(std::make_pair(104.054864, 30.673499), "四川省成都市金牛区西安中路48号"));
    testPoints.push_back(std::make_pair(std::make_pair(108.977691, 34.301165), "陕西省西安市未央区太华南路"));
    
    std::cout << "\n=== 自动测试高程计算 ===" << std::endl;
    
    // 自动测试预设点
    // 自动测试功能可以快速验证程序是否正常工作，无需用户输入
    // 对于每个测试点，程序会计算其高程并显示结果
    for (const auto& point : testPoints) {
        double longitude = point.first.first;
        double latitude = point.first.second;
        std::string location = point.second;
        
        // 计算高程
        // 这里调用DemReader类的calculateElevation方法，内部使用双线性插值算法
        double elevation = demReader.calculateElevation(longitude, latitude);
        
        // 显示结果
        std::cout << "\n位置: " << location << std::endl;
        std::cout << "坐标: (" << longitude << ", " << latitude << ")" << std::endl;
        std::cout << "高程: " << elevation << " 米" << std::endl;
    }
    
    std::cout << "\n=== 交互式高程查询（输入 'q' 退出）===" << std::endl;
    
    // 处理用户输入
    std::string input;
    while (true) {
        std::cout << "\n请输入经度: ";
        std::cin >> input;
        
        // 检查是否退出
        if (input == "q" || input == "Q") {
            break;
        }
        
        // 解析经度
        double longitude;
        try {
            longitude = std::stod(input);
        } catch (const std::invalid_argument& ia) {
            std::cerr << "错误: 无效的经度值" << std::endl;
            std::cin.clear();
            std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
            continue;
        }
        
        std::cout << "请输入纬度: ";
        std::cin >> input;
        
        // 检查是否退出
        if (input == "q" || input == "Q") {
            break;
        }
        
        // 解析纬度
        double latitude;
        try {
            latitude = std::stod(input);
        } catch (const std::invalid_argument& ia) {
            std::cerr << "错误: 无效的纬度值" << std::endl;
            std::cin.clear();
            std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
            continue;
        }
        
        // 计算高程
        double elevation = demReader.calculateElevation(longitude, latitude);
        
        // 显示结果
        std::cout << "\n位置 (" << longitude << ", " << latitude << ") 的高程为: " << elevation << " 米" << std::endl;
    }
    
    std::cout << "\n感谢使用DEM高程计算器，再见！" << std::endl;
    
    return 0;
}